# 默认参数用=赋值，参数默认参数要放到后面。
# def happy_birthday(name, age=18)
# 上面的定义会报错

def happy_birthday(name='yinsc', age=18):
    print('祝', name, str(age), '岁生日快乐~')


#######  位置传参：传递的参数和方法定义一致
happy_birthday('yinsc', 16)

#######  关键字传参：参数的传递可以和方法参数定义不一致。
happy_birthday(age=16, name='朱美琴')

#######  位置传参和关键字传参混合使用：位置传参在前，关键字传参在后
happy_birthday('yinsc', age=16)

#######  报错，这行代码关键字传参在前，位置参数在后了。
#######  happy_birthday(name='yinsc',18)

####### age默认是18了，所以可以不用传参
happy_birthday('yinsc')

print('-' * 40)

happy_birthday()

happy_birthday('zhumq')

happy_birthday('zhumq', 18)

print('-' * 40)


#######  函数只有一行代码的简写形式
def happy_birthday_lambda(name): print('生日快乐:', name)


happy_birthday_lambda('yinsc');


####### 使用*来明确区分位置参数和关键字参数
# 在函数定义中，* 表示：在此之后的所有参数都必须通过关键传递，也就是说：
# * 之前的参数可以按位置参数传递（即位置参数）
# * 之后的参数只能通过关键字传递（即关键字参数）

# 在fun函数处，a和b是位置参数，c和d是关键字参数
def fun(a, b, *, c, d):
    print(a, b, c, d)

# 正确调用：c和d必须使用关键字传参。
fun(" helll ", " world ", c=" ni ", d=" hao ")
# 错误调用：下面调用会报错，因为c和d是关键字传参，而下的c和d属于位置传参了。
# fun(" helll ", " world ", " ni ", " hao ")
